public class PolymorphismTest {
    public static void main(String[] args) {
        // 创建不同类型的动物对象
        Animal dog = new Dog("Buddy");
        Animal cat = new Cat("Whiskers");
        Animal bird = new Bird("Tweety");
        
        // 演示多态：使用父类引用调用重写的方法
        System.out.println("=== 多态演示：调用重写的方法 ===");
        dog.makeSound();   // 实际调用Dog的makeSound方法
        cat.makeSound();   // 实际调用Cat的makeSound方法
        bird.makeSound();  // 实际调用Bird的makeSound方法
        
        // 使用数组和循环展示多态的强大功能
        System.out.println("\n=== 使用数组展示多态 ===");
        Animal[] animals = {dog, cat, bird};
        
        for (Animal animal : animals) {
            animal.makeSound();  // 运行时决定调用哪个具体实现
        }
        
        // 演示多态在方法参数中的应用
        System.out.println("\n=== 多态在方法参数中的应用 ===");
        makeAnimalSleep(dog);
        makeAnimalSleep(cat);
        makeAnimalSleep(bird);
        
        // 演示向下转型 (casting)
        System.out.println("\n=== 向下转型演示 ===");
        if (dog instanceof Dog) {
            Dog dogRef = (Dog) dog;  // 向下转型
            dogRef.wagTail();        // 调用Dog特有的方法
        }
        
        if (cat instanceof Cat) {
            Cat catRef = (Cat) cat;  // 向下转型
            catRef.purr();           // 调用Cat特有的方法
        }
        
        if (bird instanceof Bird) {
            Bird birdRef = (Bird) bird; // 向下转型
            birdRef.fly();              // 调用Bird特有的方法
        }
        
        // 演示多态的好处：可扩展性
        System.out.println("\n=== 多态的好处：可扩展性 ===");
        Animal newAnimal = new Animal("Mystery") {
            @Override
            public void makeSound() {
                System.out.println("Mystery animal makes a strange sound!");
            }
        };
        
        newAnimal.makeSound();
    }
    
    // 使用多态作为方法参数，可以接受任何Animal子类对象
    public static void makeAnimalSleep(Animal animal) {
        System.out.print("Calling sleep() on " + animal.getName() + ": ");
        animal.sleep();
    }
}